import axios from 'axios'
import { getStorage, removeStorage } from './localStorage'
import router from '../router'
import { message } from 'antd'
import * as _ from 'lodash'
const request = axios.create({
  baseURL: 'http://geek.itheima.net/v1_0',
  timeout: 5000
})

// 请求拦截器
// 携带token
request.interceptors.request.use(
  (config) => {
    // 1. 从本地存储中获取token
    // 2. 按照后端的格式做token拼接
    const token = getStorage('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 创建防抖函数
// const debounceMessage = (() => {
//   let timer = null
//   return (msg) => {
//     if (timer) clearTimeout(timer)
//     timer = setTimeout(() => {
//       message.error(msg)
//       timer = null
//     }, 300)
//   }
// })()

// 借助lodash库创建防抖函数
const showError = _.debounce(() => message.error('登录过期，请重新登录'), 300)

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data
  },
  (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    // token失效
    if (error.response.status === 401) {
      // 1. 清除本地token
      // 2. 跳转到登录页
      // 提示用户
      removeStorage('token')
      router.navigate('/login')
      showError()
      // debounceMessage('登录过期，请重新登录')

      return Promise.reject(error)
    }
    // 其他错误提示
    message.error(error.response.data.message || '网络出错了亲~')
    return Promise.reject(error)
  }
)

export default request
